package top.caoayu.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

@Aspect
public class LogAspect {
    /*
    * @Around("execution(* tech.pdai.springframework.service.*.*(..))") 是一个切面的注解配置，用于指定拦截的方法执行规则。

    在这个例子中，@Around 是一个环绕通知的注解，它表示这个切面将会在目标方法执行的前后都进行拦截。拦截的规则是通过 execution() 表达式来指定的。

    execution(* tech.pdai.springframework.service.*.*(..)) 是一个切点表达式，它描述了被拦截的方法的匹配规则。具体解释如下：

    execution() 是切点表达式的函数名。
    * 表示匹配任意返回类型的方法。
    tech.pdai.springframework.service 表示包路径。这里指定了 tech.pdai.springframework.service 包下的所有类。
    *.* 表示匹配所有类中的所有方法。
    (..) 表示匹配任意参数的方法。
    综上所述，这个切点表达式的意思是拦截 tech.pdai.springframework.service 包下的所有类的所有方法。
    * */
    @Around("execution(* top.caoayu.service.impl.*.*(..))")
    public Object businessService(ProceedingJoinPoint p) throws Throwable {
        /*
         * 代码中的类型转换是为了获取被拦截方法的方法名。p.getSignature() 返回的是 JoinPoint.StaticPart 对象，它是一个通用的连接点信息类。为了获取方法名，我们需要将其转换为 MethodSignature 类型，然后调用 getMethod() 方法来获取方法对象。这样我们就可以打印出被拦截方法的名称了。
         * */
        Method method = ((MethodSignature) p.getSignature()).getMethod();
        System.out.println("method: " + method.getName());
        return p.proceed();
    }
}
